package com.javaweb.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

/**
 * @desc: todo: 实现对 DAO层的所有方法的执行进行日志输出，日志信息
 *              包括如下：
 *              1） 方法名字
 *              2） 执行消耗时间（S）
 *
 * @author:
 * @date:
 */
@Aspect
@Component
@Slf4j
public class LogAspect {
    // 定义切点，匹配DAO层的所有方法
    @Pointcut("execution(public * com.javaweb.dao..*.*(..))")
    public void daoLayerAllMethods(){}

    // 环绕通知，用于记录方法执行时间和方法名
    @Around("daoLayerAllMethods()")
    public Object measurePerformanceForAllDaoMethods(
            ProceedingJoinPoint pjp) {
        /**
        * before method execution, set a starting time.
         */
        Long start = System.currentTimeMillis() ;
        String methodName = pjp.getSignature().getName() ;
        Object ret = null ;
        try {
            ret = pjp.proceed();
        } catch (Throwable e) {
            log.error("method: " + methodName
                    + " met an error: " + e.getMessage()) ;
        }
        /**
         * after its execution, set an ending time-point.
         */
        Long end = System.currentTimeMillis() ;
        /**
          log for performance.
         */
        log.info("method: " + methodName
                + ", spent (s): " + (end - start) / 1000.0) ;
        return ret ;
    }
}
